/**
 *
 * 版权所有 © cybersky.com
 *
 */
package cn.cybertron.primus.report.data;

import org.gibello.zql.ZSelectItem;

import cn.cybertron.matrix.event.data.EventAttr;

/**
 * 中间表字段信息
 * @author ch
 *
 */
public class ZReportItem extends ZSelectItem {

	private static final long serialVersionUID = -2572207507191448523L;

	public static final String[] countField = new String[]{ "count", "cardinality" };
	
	/**
	 * 字段
	 */
	protected EventAttr field;
		
	public ZReportItem() {
		super();
	}
	
	public ZReportItem(String fullname) {
		super(fullname);
	}
	
	public ZReportItem(EventAttr field) {
		super(field.getName());
		this.field = field;
	}
	
	public EventAttr getField() {
		return field;
	}

	public void setField(EventAttr field) {
		this.field = field;
	}

	/**
	 * 创建中间表字段名称
	 * 统计字段 统计方式
	 * 	cn.cybertron.primus.event.data.Statistics.FuncField.Func:
	 * 	count 计数, cardinality 非重复计数（设置为Long）, avg 平均值, sum 求和, max 最大值, min 最小值
	 *
	 * 分组字段
	 */
	public String appendCreateSql() {
		//不限制长度（原始信息）
		if(field.getLength() < 1){
			return " text, ";
		}
				
		StringBuilder sql = new StringBuilder();
		sql.append(getTableColumnName()).append(" ");
		if(isCountField()){//统计字段： 计数字段(count、cardinality)
				sql.append(" bigint(20), ");
		} else {
			// 统计字段(avg 平均值, sum 求和, max 最大值, min 最小值) 或 分组字段
			String typename = "varchar";
			switch(field.getDataType().getBaseType()){
				case INT:
					typename = "int";
					break;
				case LONG:
					typename = "bigint";
					break;
				case DOUBLE:
					typename = "double";
					break;
				default://STRING ARRAY
					break;
			}
			sql.append(typename).append("(").append(field.getLength()).append("), ");
		}
	
		return sql.toString();
	}
	
	/**
	 * 判断是否为统计计数字段
	 * 统计字段： 计数字段(count、cardinality)
	 */
	public boolean isCountField(){
		if(this.getAggregate() != null && "count".equalsIgnoreCase(this.getAggregate()) || "cardinality".equalsIgnoreCase(this.getAggregate())){
			return true;	
		}
		return false;
	}

	/**
	 * 根据中间表的配置字段获取真实的、数据库表中使用的列名
	 * 用于创建中间表、统计中间表、从中间表中获取数据时使用
	 * <p>规则：
	 * <ul>
	 * <li>如果设置了聚合函数属性(aggregate)，则使用${column}_${aggregate}组合的值，否则返回${column}</li>
	 * <li>如果item设置了别名属性(alias)，则${column}为别名，否则为column属性值</li>
	 * </ul>
	 * </p>
	 * @param item
	 * @return
	 */
	public String getTableColumnName() {
		String alias = this.getAlias();
		if (alias != null && alias.trim().length() > 0)
			return alias;
		
		String tableColumn = this.getColumn();
		String aggregate = this.getAggregate();
		String tableName = this.getTable();
		
		if(tableName != null && tableName.trim().length() > 0)
			tableColumn = tableName + "." + tableColumn;
		return tableColumn + (aggregate != null && aggregate.trim().length() > 0 ? "_" + aggregate.trim().toLowerCase() : "");
	}
			
}
